﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
//内存函数
//memcpy:完成内存块拷⻉的,不关注内存中存放的数据是啥
//头文件string.h
//void* memcpy(void* destination,const void* source,size_t num)
//函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
//如果 source 和 destination 有任何的重叠，复制的结果都是未定义的。
//内存重叠的情况使⽤memmove就⾏
//模拟实现
//memcpy负责拷贝两块独立空间中的数据
//void* my_memcpy(void* dst, const void* src, size_t num)
//{
//	void* ret = dst;
//	assert(dst && src);
//	while (num--) {
//		*(char*)dst = *(char*)src;
//		dst = (char*)dst + 1;
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main() {
//	int arr1[] = { 1,2,3,4,5,6,7 };
//	//int arr2[10] = { 0 };
//	my_memcpy(arr1+2, arr1, 12);
//
//	return 0;
//}


//memmove:处理的源内存块和⽬标内存块是可以重叠的
//void *memmove(void* destination,const void* source,size_t num)
//模拟实现
//void* my_memmove(void* dst, const void* src, size_t num)
//{
//	void* ret = dst;
//		//前->后
//		assert(dst && src);
//		if(dst<src){
//		while (num--) {
//			*(char*)dst = *(char*)src;
//			dst = (char*)dst + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else {
//		//后->前
//		while (num--) {
//			*((char*)dst + num) = *((char*)src + num);
//		}
//	}
//	return(ret);
//}
//int main() {
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	//int arr2[10] = { 0 };
//	my_memmove(arr1+3, arr1, 20);
//	return 0;
//}

//memcmp:⽐较指定的两块内存块的内容,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
//int memcmp(const void* ptr1,const void* ptr2,size_t num)
//任何类型的数据都可以比较,比较的是字节

//memset:⽤来设置内存块的内容的，将内存中指定⻓度的空间设置为特定的内容。
//需要包含 <string.h>
//void* memset(void* ptr,int value,size_t num )
//指针,指向要设置的内存空间，也就是存放了要设置的内存空间的起始地址。
//value:要设置的值,函数将会把value值转换成unsigned char的数据进⾏设置的
//字节为单位来设置内存块的。
//num:要设置的内存⻓度,单位是字节。
//返回值：返回的是要设置的内存空间的起始地址
int main()
{
	char str[] = "hello world";
	/*memset(str, 'x', 6);
	printf("%s\n",str);*/
	memset(str+1, 'x', 3);
	printf("%s\n", str);
	return 0;
}
